﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AgendaManager.AgendaService;
using System.IO;

namespace AgendaManager
{
    public partial class frmIvoNota : Form
    {
        Carpeta Carpeta { get; set; }
        List<IvoNota> IvoNotas = new List<IvoNota>();

        public frmIvoNota()
        {
            InitializeComponent();
        }

        internal void SetValues(Obra obra, Carpeta carpeta)
        {
            try
            {
                Carpeta = carpeta;

                txObra.Text = obra.Nombre;
                txCarpeta.Text = Carpeta.Tipo;

                FillGvIvoNota();
            }
            catch (Exception)
            {

                throw;
            }
        }

        private void FillGvIvoNota()
        {
            try
            {
                IvoNotas = ConnectHelper.ws.GetIvosNames("CarpetaId = " + Carpeta.Id).Cast<IvoNota>().ToList();
                //IvoNotas = ConnectHelper.ws.RetrieveEntitiesWhere(new IvoNota(), "CarpetaId = " + Carpeta.Id).Cast<IvoNota>().ToList();

                try
                {
                    var aux = from f in IvoNotas
                              select new
                              {
                                  Num = f.Nombre.Contains("IVO") ?
                                    (f.Nombre.Contains("2013") || f.Nombre.Contains("2014") || f.Nombre.Contains("2015") ? 2 : 3) : 1,
                                  CarpetaId = f.CarpetaId,
                                  Nombre = f.Nombre,
                                  Extension = f.Extension,
                                  Id = f.Id
                              };

                    gvIvoNota.DataSource = null;
                    gvIvoNota.DataSource = aux.OrderByDescending(x => x.Num).ToList();
                }
                catch (Exception)
                {

                    var aux = from f in IvoNotas
                              orderby f.Nombre ascending
                              select new
                              {
                                  Num = 0,
                                  CarpetaId = f.CarpetaId,
                                  Nombre = f.Nombre,
                                  Extension = f.Extension,
                                  Id = f.Id
                              };

                    gvIvoNota.DataSource = null;
                    gvIvoNota.DataSource = aux.ToList();
                }


                gvIvoNota.Columns["CarpetaId"].Visible = false;
                gvIvoNota.Columns["Num"].Visible = false;
                gvIvoNota.Columns["Id"].Visible = false;
                gvIvoNota.Columns["Nombre"].Width = 413;
                gvIvoNota.Columns["Extension"].Width = 100;
            }
            catch (Exception)
            {

                throw;
            }
        }

        private void btnNuevaIvoNota_Click(object sender, EventArgs e)
        {
            List<IvoNota> ivos = new List<IvoNota>();
            this.openFileDialog.Multiselect = true;
            this.openFileDialog.Title = "Select File";

            DialogResult dr = this.openFileDialog.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                foreach (string file in openFileDialog.FileNames)
                {
                    try
                    {
                        byte[] archivo = File.ReadAllBytes(file);

                        IvoNota ivoNota = new IvoNota();

                        ivoNota.Nombre = Path.GetFileNameWithoutExtension(file);
                        ivoNota.Archivo = archivo;
                        ivoNota.Extension = Path.GetExtension(file);
                        ivoNota.CarpetaId = Carpeta.Id;

                        ivos.Add(ivoNota);
                    }
                    catch (Exception)
                    {

                        throw;
                    }
                }

                MessageBox.Show("Se están subiendo las Ivos al servidor, puede continuar utilizando el programa pero por favor no cerrarlo hasta que se encuentre Listo.",
                                    "Subiendo Ivos.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);

                bwUpload.RunWorkerAsync(ivos);

            }
        }

        private void btnDescargarTodo_Click(object sender, EventArgs e)
        {
            try
            {
                using (FolderBrowserDialog fbd = new FolderBrowserDialog())
                {
                    fbd.ShowNewFolderButton = true;
                    string folderPath = string.Empty;
                    if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        folderPath = fbd.SelectedPath;
                        foreach (IvoNota ivoNota in IvoNotas)
                        {
                            File.WriteAllBytes(folderPath + @"\" + ivoNota.Nombre + ivoNota.Extension, ivoNota.Archivo);
                        }


                        MessageBox.Show("Los Ivos se han descargado correctamente.",
                                    "Descarga de Ivos.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Ocurrió un problema al descargar el archivo, por favor intente nuevamente mas tarde.",
                        "Descarga de Ivos.",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);
                throw;
            }
        }

        private void btnDescargarSeleccionado_Click(object sender, EventArgs e)
        {
            if (gvIvoNota.SelectedRows.Count == 1)
            {
                try
                {
                    IvoNota ivoNota = IvoNotas.FirstOrDefault(x => x.Id == (int)gvIvoNota.SelectedRows[0].Cells["Id"].Value);

                    IvoNota ivoToDownload = ConnectHelper.ws.RetrieveEntitiesWhere(ivoNota, "Id = " + ivoNota.Id).Cast<IvoNota>().ToList().FirstOrDefault();

                    if (ivoToDownload != null)
                    {
                        this.saveFileDialog.FileName = ivoToDownload.Nombre;
                        this.saveFileDialog.DefaultExt = ivoToDownload.Extension;
                        this.saveFileDialog.ShowDialog();
                        File.WriteAllBytes(saveFileDialog.FileName, ivoToDownload.Archivo);

                        MessageBox.Show("El Ivo ha sido descargado correctamente.",
                                    "Descarga Ivo.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Ocurrió un problema al descargar el Ivo, por favor intente nuevamente mas tarde.",
                            "Descarga Ivo.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                    throw;
                }
            }
        }

        private void bWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<IvoNota> ivos = new List<IvoNota>();
                ivos = e.Argument as List<IvoNota>;
                ConnectHelper.ws.Timeout = 600000;
                int i = 1;
                foreach (IvoNota ivoNota in ivos)
                {
                    FormsHelper.ChangeStatusLabel("Subiendo " + i + " de " + Convert.ToInt32(ivos.Count) + " Ivos.");
                    ConnectHelper.ws.NuevaIvoNota(ivoNota);
                    i++;
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        private void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Los Ivos han sido guardado exitosamente.",
                        "Nuevos Ivos.",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);

            FillGvIvoNota();
            FormsHelper.ChangeStatusLabel("Listo.");
        }

        private void bwDownload_DoWork(object sender, DoWorkEventArgs e)
        {
            //ConnectHelper.ws.Timeout = 600000;
            //int i = 1;
            //int max = ConnectHelper.ws.GetMax(new IvoNota());

            //FormsHelper.ChangeStatusLabel("Descargando Ivos...");

            //while (i <= max)
            //{
            //    List<Foto> f = ConnectHelper.ws.GetEntitiesPaginated(new IvoNota(), i, "SubCarpetaId = " + SubCarpeta.Id.ToString()).Cast<Foto>().ToList();
            //    if (f != null && f.Count > 0)
            //        Fotos.AddRange(f);
            //    i += 10;
            //}
        }

        private void btEliminar_Click(object sender, EventArgs e)
        {
            if (gvIvoNota.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("Está seguro que desea eliminar el Informe seleccionado de manera definitiva?",
                            "Eliminar Informe.",
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Exclamation) ==
                            System.Windows.Forms.DialogResult.Yes)
                {
                    try
                    {
                        IvoNota ivoNota = IvoNotas.FirstOrDefault(x => x.Id == (int)gvIvoNota.SelectedRows[0].Cells["Id"].Value);

                        ConnectHelper.ws.DeleteEntity(ivoNota);

                        MessageBox.Show("El Ivo ha sido eliminado con éxito.",
                        "Eliminar Ivo.",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);

                        FillGvIvoNota();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("El Ivo no se pudo eliminar, por favor intentelo más tarde.",
                        "Eliminar Ivo.",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                    }
                }

                
            }

        }
    }
}
